using System;
using System.Collections.Generic;
using System.Text;

namespace ControladorDifuso.Conjunto
{
    public abstract class ConjuntoDifuso : IPertenencia
    {
        
        /// <summary>
        /// Atributos
        /// </summary>
        private string strNombre;
        private EspacioDifuso espacioDifuso;
        protected bool esLocal;
        
        /// <summary>
        /// Propiedades o acceso a atributos
        /// </summary>
        public string Nombre
        {
            get { return this.strNombre; }
            set { this.strNombre = value; }
        }
        public EspacioDifuso EspacioDifuso
        {
            get { return this.espacioDifuso; }
            set { this.espacioDifuso = value; }
        }
        public bool EsLocal
        {
            get { return this.esLocal; }
        }
       
        public decimal ValorMaximo
        {
            get
            {
                return this.EspacioDifuso.ValorMaximo;
            }
        }

        public decimal ValorMinimo
        {
            get
            {
                return this.EspacioDifuso.ValorMinimo;
            }
        }
        /// <summary>
        /// Retorna un valor booleano en el que se dice si a un valor de entrada esta conjunto es disparado
        /// </summary>
        /// <param name="entrada">valor para el cual se toma la medida</param>
        /// <returns>si o no es disparado</returns>
        public bool EsDisparada(decimal entrada)
        {
            return Pertenencia() > 0;
        }

        public void Muestreo (ref double[] xPuntos, ref double[] yPuntos)
        {
            decimal deltaMuestreo = (this.ValorMaximo - this.ValorMinimo) / Conjunto.EspacioDifuso.NumeroMuestras;
            decimal x = this.ValorMinimo;
            for (int indice = 0; indice < Conjunto.EspacioDifuso.NumeroMuestras; indice++)
            {
                xPuntos[indice] = (double)x;
                this.espacioDifuso.Muestra = x;
                yPuntos[indice] = (double)this.Pertenencia();
                x += deltaMuestreo;
            }
        }

        public abstract decimal Pertenencia();

        public override string ToString()
        {
            return this.Nombre;
        }
    }
}
